#include <stdio.h>
 #include "msg_queue_peer.h"
 #include "shmem.h"



static struct shm_param para;

struct student
{
    int num;
    char name[64];
};

static int *total;  //指向共享内存中数据节点总个数
static struct student *node_arr;  //指向共享内存中节点缓存数组头

#define MAX_NODE 128  //最大支持学生数目，实际可用是127
#define STD_NODE_LEN sizeof(struct student)
#define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN)

int main(int argc, char *argv[])
{
    int ret = -1;

    ret = shm_init(&para, "shm_test", MAX_NODE_SIZE);
    if(ret < 0)
    {
        return -1;
    }

    void *node_p = shm_getaddr(&para);
    if(node_p == NULL)
    {
        return -1;
    }

    memset(node_p, 0, MAX_NODE_SIZE);

    //前4个字节存储实际的学生数目
    total = (int *)node_p;
    //后面空间存储数据点
    node_arr = (struct student *)(node_p + sizeof(int));

    *total = 3;  //假设有3个人

    //第1个人赋值
    node_arr[0].num = 1;
    strcpy(node_arr[0].name, "zhangsan");

    //第2个人赋值
    //(node_arr + 1)->num = 2;  //和下面的数组写法达到的效果是等效的
    node_arr[1].num = 2;
    strcpy(node_arr[1].name, "lisi");

    //第3个人赋值
    node_arr[2].num = 3;
    strcpy(node_arr[2].name, "wangwu");

    return 0;
}







// #if 0
// struct msgbuf
// {
//     long mtype;
//     char mdata[256];
// };

// int main(int argc, char *argv[])
// {
//     struct msgbuf send_buf;

//     //这个mtype可以不用，但是必须赋一个不小于0的数
//     send_buf.mtype = 1;

//     while (1)
//     {
//         gets(send_buf.mdata);

//         if(msg_queue_send("topic", &send_buf, sizeof(send_buf), 0) < 0)
//         {
//             printf("msg_queue_send error\n");
//             return -1;
//         }
//     }

//     return 0;
// }
// #else
// static struct shm_param para;

// struct student
// {
//     int num;
//     char name[64];
// };

// int main(int argc, char *argv[])
// {
//     int ret = -1;

//     ret = shm_init(&para, "shm_test", 1024);
//     if(ret < 0)
//     {
//         return -1;
//     }

//     struct student *addr = (struct student *)shm_getaddr(&para);
//     if(addr == NULL)
//     {
//         return -1;
//     }

//     addr->num = 10;
//     strcpy(addr->name, "zhangsan");

//     return 0;
// }
// #endif